<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="Docusaurus v2.0.0-alpha.65">
<title data-react-helmet="true">9.26 读写分离/主从复制 | Fur</title><meta data-react-helmet="true" name="docsearch:version" content="current,latest"><meta data-react-helmet="true" name="twitter:card" content="summary_large_image"><meta data-react-helmet="true" property="og:title" content="9.26 读写分离/主从复制 | Fur"><meta data-react-helmet="true" name="description" content="9.26.1 读写分离"><meta data-react-helmet="true" property="og:description" content="9.26.1 读写分离"><meta data-react-helmet="true" property="og:url" content="https://furos.cn/docs/dbcontext-read-write"><link data-react-helmet="true" rel="shortcut icon" href="/img/favicon.ico"><link data-react-helmet="true" rel="canonical" href="https://furos.cn/docs/dbcontext-read-write"><link rel="stylesheet" href="/styles.8aef5b7b.css">
<link rel="preload" href="/styles.8352e18a.js" as="script">
<link rel="preload" href="/runtime~main.98e14d7d.js" as="script">
<link rel="preload" href="/main.04e1b7d6.js" as="script">
<link rel="preload" href="/1.72c59440.js" as="script">
<link rel="preload" href="/2.a2e0b0a9.js" as="script">
<link rel="preload" href="/3.054f69af.js" as="script">
<link rel="preload" href="/1be78505.da78ff7d.js" as="script">
<link rel="preload" href="/85.0018927c.js" as="script">
<link rel="preload" href="/f976f453.e1be0e0e.js" as="script">
<link rel="preload" href="/17896441.9aece880.js" as="script">
<link rel="preload" href="/4dbcf072.85d323b6.js" as="script">
</head>
<body>
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<nav class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><div aria-label="Navigation bar toggle" class="navbar__toggle" role="button" tabindex="0"><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 30 30" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></div><a class="navbar__brand" href="/"><img class="navbar__logo" src="/img/logo.png" alt="Fur Logo"><strong class="navbar__title">Fur</strong></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs/">Next</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs">文档</a><a class="navbar__item navbar__link" href="/blog">博客</a><a href="https://chinadot.net" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">社区</a></div><div class="navbar__items navbar__items--right"><a href="https://space.bilibili.com/695987967" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">视频</a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">工具</a><ul class="dropdown__menu"><li><a target="_blank" rel="noopener noreferrer" class="dropdown__link" position="left">代码生成器</a></li></ul></div><a href="https://gitee.com/monksoul/Fur/board" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">看板</a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">仓库</a><ul class="dropdown__menu"><li><a href="https://gitee.com/monksoul/Fur" target="_blank" rel="noopener noreferrer" class="dropdown__link" position="left">Gitee</a></li><li><a href="https://github.com/MonkSoul/Fur" target="_blank" rel="noopener noreferrer" class="dropdown__link" position="left">GitHub</a></li></ul></div><div class="react-toggle react-toggle--disabled displayOnlyInLargeViewport_2aTZ"><div class="react-toggle-track"><div class="react-toggle-track-check"><span class="toggle_BsTx">🌜</span></div><div class="react-toggle-track-x"><span class="toggle_BsTx">🌞</span></div></div><div class="react-toggle-thumb"></div><input type="checkbox" disabled="" aria-label="Dark mode toggle" class="react-toggle-screenreader-only"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div><div class="navbar-sidebar"><div class="navbar-sidebar__brand"><a class="navbar__brand" href="/"><img class="navbar__logo" src="/img/logo.png" alt="Fur Logo"><strong class="navbar__title">Fur</strong></a></div><div class="navbar-sidebar__items"><div class="menu"><ul class="menu__list"><li class="menu__list-item"><a target="_blank" rel="noopener noreferrer" class="menu__link">Versions</a></li><li class="menu__list-item"><a aria-current="page" class="menu__link navbar__link--active" href="/docs">文档</a></li><li class="menu__list-item"><a class="menu__link" href="/blog">博客</a></li><li class="menu__list-item"><a href="https://chinadot.net" target="_blank" rel="noopener noreferrer" class="menu__link">社区</a></li><li class="menu__list-item"><a href="https://space.bilibili.com/695987967" target="_blank" rel="noopener noreferrer" class="menu__link">视频</a></li><li class="menu__list-item"><a target="_blank" rel="noopener noreferrer" class="menu__link menu__link--sublist">工具</a><ul class="menu__list"><li class="menu__list-item"><a target="_blank" rel="noopener noreferrer" class="menu__link" position="left">代码生成器</a></li></ul></li><li class="menu__list-item"><a href="https://gitee.com/monksoul/Fur/board" target="_blank" rel="noopener noreferrer" class="menu__link">看板</a></li><li class="menu__list-item"><a target="_blank" rel="noopener noreferrer" class="menu__link menu__link--sublist">仓库</a><ul class="menu__list"><li class="menu__list-item"><a href="https://gitee.com/monksoul/Fur" target="_blank" rel="noopener noreferrer" class="menu__link" position="left">Gitee</a></li><li class="menu__list-item"><a href="https://github.com/MonkSoul/Fur" target="_blank" rel="noopener noreferrer" class="menu__link" position="left">GitHub</a></li></ul></li></ul></div></div></div></nav><div class="main-wrapper"><div class="docPage_2gpo"><div class="docSidebarContainer_3_JD" role="complementary"><div class="sidebar_2urC"><div class="menu menu--responsive menu_5FrY"><button aria-label="Open Menu" aria-haspopup="true" class="button button--secondary button--sm menu__button" type="button"><svg aria-label="Menu" class="sidebarMenuIcon_Dm3K" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 32 32" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><ul class="menu__list"><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">1. 框架介绍</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/">1.1 介绍</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/author">1.2 关于作者</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/source">1.3 源码结构</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/reference">1.4 项目引用</a></li></ul></li><li class="menu__list-item"><a class="menu__link" href="/docs/get-start">2. 一分钟入门</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/appstartup">3. 应用启动</a></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">4. 配置与选项</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/configuration">4.1 配置</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/options">4.2 选项</a></li></ul></li><li class="menu__list-item"><a class="menu__link" href="/docs/dynamic-api-controller">5. 动态 WebAPI</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/specification-document">6. 规范化接口文档</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/friendly-exception">7. 友好异常处理</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/data-validation">8. 数据校验</a></li><li class="menu__list-item"><a class="menu__link menu__link--sublist menu__link--active" href="#!">9. 数据库操作指南</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext">9.1 数据库上下文</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-locator">9.2 数据库上下文定位器</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/entity">9.3 数据库实体</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-repository">9.4 仓储模式</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-add">9.5 新增操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-update">9.6 更新操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-add-or-update">9.7 新增或更新操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-delete">9.8 删除操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-batch">9.9 批量操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-query">9.10 查询操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-hight-query">9.11 高级查询操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-view">9.12 视图操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-proc">9.13 存储过程操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-function">9.14 函数操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-sql">9.15 Sql 操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-sql-template">9.16 Sql 模板</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-sql-proxy">9.17 Sql 高级代理</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-multi-database">9.18 多数据库操作</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-db-first">9.19 数据库生成模型</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-code-first">9.20 模型生成数据库</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-seed-data">9.21 实体种子数据</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-audit">9.22 审计日志</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-filter">9.23 实体/全局查询筛选器</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dbcontext-Interceptor">9.24 数据库操作拦截器</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/tran">9.25 事务和工作单元</a></li><li class="menu__list-item"><a aria-current="page" class="menu__link menu__link--active active" tabindex="0" href="/docs/dbcontext-read-write">9.26 读写分离/主从复制</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/docs/split-db">9.27 分表分库</a></li></ul></li><li class="menu__list-item"><a class="menu__link" href="/docs/saas">10. SaaS 多租户</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/dependency-injection">11. 依赖注入/控制反转</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/object-mapper">12. 对象数据映射</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/cache">13. 分布式缓存</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/auth-control">14. 安全鉴权</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/cors">15. CORS 跨域</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/view-engine">16. 视图引擎</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/local-language">17. 多语言处理</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/event-bus">18. 事件总线</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/logging">19. 日志记录</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/http">20. 网络请求</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/process-service">21. 进程服务</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/job">22. 任务调度</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/signalr">23. 即时通讯</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/grpc">24. Grpc 服务</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/deploy">25. 托管部署</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/devops">26. 持续部署集成</a></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">27. 测试指南</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/unittest">27.1 单元测试</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/performance">27.2 性能测试</a></li></ul></li><li class="menu__list-item"><a class="menu__link" href="/docs/contribute">28. 贡献指南</a></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">29. 常见问题</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/answer">29.1 常见问题</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/errors">29.2 常见错误</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/docs/gooduse">29.3 最佳实践</a></li></ul></li></ul></div></div></div><main class="docMainContainer_3EyW"><div class="container padding-vert--lg docItemWrapper_1EkI"><div class="row"><div class="col docItemCol_2ASc"><div class="docItemContainer_3QWW"><article><header><h1 class="docTitle_1Lrw">9.26 读写分离/主从复制</h1></header><div class="markdown"><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="9261-读写分离"></a>9.26.1 读写分离<a aria-hidden="true" tabindex="-1" class="hash-link" href="#9261-读写分离" title="Direct link to heading">#</a></h2><p>其实就是将数据库分为了主从库，一个主库用于写数据，多个从库完成读数据的操作，主从库之间通过某种机制进行数据的同步，是一种常见的数据库架构。</p><img src="/img/readwrite.png" style="height:300px"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92611-解决了什么问题"></a>9.26.1.1 解决了什么问题<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92611-解决了什么问题" title="Direct link to heading">#</a></h3><p>大多数互联网业务，往往读多写少，这时候，数据库的读会首先成为数据库的瓶颈，这时，如果我们希望能够线性的提升数据库的读性能，消除读写锁冲突从而提升数据库的写性能，那么就可以使用“分组架构”（读写分离架构）。</p><p>用一句话概括，读写分离是用来解决数据库的读性能瓶颈的。</p><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92612-注意事项"></a>9.26.1.2 注意事项<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92612-注意事项" title="Direct link to heading">#</a></h3><ul><li>数据库连接池要进行区分，哪些是读连接池，哪个是写连接池，研发的难度会增加；</li><li>为了保证高可用，读连接池要能够实现故障自动转移；</li><li>主从的一致性问题需要考虑。</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="9262-如何实现"></a>9.26.2 如何实现<a aria-hidden="true" tabindex="-1" class="hash-link" href="#9262-如何实现" title="Direct link to heading">#</a></h2><p><code>Fur</code> 在数据库模块设计之初，就考虑了读写分离这种情况，所以从底层就支持动态切换数据库上下文及读写操作方法约束。</p><p>读写分离操作主要使用 <code>IMSRepository</code> 仓储，该仓储已经为开发者提供方便的操作调用。当然也可以不使用该仓储。</p><p>下面就给大家演示如何读写多库读写操作。</p><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92621-创建-主库-数据库上下文"></a>9.26.2.1 创建 <code>主库</code> 数据库上下文<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92621-创建-主库-数据库上下文" title="Direct link to heading">#</a></h3><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-cs codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Fur.DatabaseAccessor;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Microsoft.EntityFrameworkCore;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">namespace Fur.EntityFramework.Core</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /// 主库数据库上下文</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /// &lt;/summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    [AppDbContext(&quot;MasterConnectionString&quot;)]</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    public class MasterDbContext : AppDbContext&lt;MasterDbContext&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        public MasterDbContext(DbContextOptions&lt;MasterDbContext&gt; options) : base(options)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span></div></div></div></div></div><p><strong>数据库连接字符串：</strong></p><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-json codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;ConnectionStrings&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;MasterConnectionString&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;Server=localhost;Database=Fur;User=sa;Password=000000;MultipleActiveResultSets=True;&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></div></div></div></div><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92622-创建-从库-数据库上下文"></a>9.26.2.2 创建 <code>从库</code> 数据库上下文<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92622-创建-从库-数据库上下文" title="Direct link to heading">#</a></h3><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-cs codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Fur.Core;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Fur.DatabaseAccessor;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Microsoft.EntityFrameworkCore;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">namespace Fur.EntityFramework.Core</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /// 从库数据库上下文</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /// &lt;/summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    [AppDbContext(&quot;SlaveConnectionString&quot;)]</span></div><div class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">    public class SlaveDbContext : AppDbContext&lt;SlaveDbContext, SlaveDbContextLocator&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        public SlaveDbContext(DbContextOptions&lt;SlaveDbContext&gt; options) : base(options)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span></div></div></div></div></div><div class="admonition admonition-important alert alert--info"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>特别注意</h5></div><div class="admonition-content"><p>多数据库操作除了默认数据库无需自定义 <strong>数据库上下文定位器</strong>，其他数据库都需要有数据库上下文定位器。如 <code>SlaveDbContextLocator</code></p></div></div><p><strong>从库数据库上下文定位器：</strong></p><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-cs codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Fur.DatabaseAccessor;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">namespace Fur.Core</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /// 从库数据库上下文定位器</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /// &lt;/summary&gt;</span></div><div class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">    public class SlaveDbContextLocator : IDbContextLocator</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span></div></div></div></div></div><p><strong>数据库连接字符串：</strong></p><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-json codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token property">&quot;ConnectionStrings&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token property">&quot;SlaveConnectionString&quot;</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">&quot;Server=localhost;Database=FurSlave;User=sa;Password=000000;MultipleActiveResultSets=True;&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></div></div></div></div><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92623-注册-主从库-数据库上下文"></a>9.26.2.3 注册 <code>主从库</code> 数据库上下文<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92623-注册-主从库-数据库上下文" title="Direct link to heading">#</a></h3><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-cs codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Fur.Core;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Microsoft.Extensions.DependencyInjection;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">namespace Fur.EntityFramework.Core</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    [AppStartup(600)]</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    public sealed class FurEntityFrameworkCoreStartup : AppStartup</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        public void ConfigureServices(IServiceCollection services)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            services.AddDatabaseAccessor(options =&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            {</span></div><div class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">                services.AddSqlServerPool&lt;MasterDbContext&gt;();</span></div><div class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">                services.AddSqlServerPool&lt;SlaveDbContext, SlaveDbContextLocator&gt;();</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            });</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span></div></div></div></div></div><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92624-创建-person-实体"></a>9.26.2.4 创建 <code>Person</code> 实体<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92624-创建-person-实体" title="Direct link to heading">#</a></h3><p>由于 <code>主从库</code> 具有相同的数据库结构，所以实体也必须声明 <code>主从库</code>：</p><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-cs codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Fur.DatabaseAccessor;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">using System.ComponentModel.DataAnnotations;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">using System.ComponentModel.DataAnnotations.Schema;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">namespace Fur.Core</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">    public class Person : IEntity&lt;MasterDbContextLocator, SlaveDbContextLocator&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// 主键Id</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;/summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        [Key]</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        public int Id { get; set; }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// 名称</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;/summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        public string Name { get; set; }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// 年龄</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;/summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        public int Age { get; set; }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span></div></div></div></div></div><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92625-将-person-转换成数据库表"></a>9.26.2.5 将 <code>Person</code> 转换成数据库表<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92625-将-person-转换成数据库表" title="Direct link to heading">#</a></h3><p><strong>创建主库数据库表：</strong></p><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-shell codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">Add-Migration v0.0.1 -Context MasterDbContext</span></div></div></div></div></div><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-shell codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">Update-Database -Context MasterDbContext</span></div></div></div></div></div><p><strong>创建从库数据库表：</strong></p><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-shell codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">Add-Migration v0.0.1 -Context SlaveDbContext</span></div></div></div></div></div><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-shell codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">Update-Database -Context SlaveDbContext</span></div></div></div></div></div><img src="/img/readwrite1.png"><img src="/img/readwrite2.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92626-使用例子"></a>9.26.2.6 使用例子<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92626-使用例子" title="Direct link to heading">#</a></h3><div class="mdxCodeBlock_1XEh"><div class="codeBlockContent_1u-d"><button type="button" aria-label="Copy code to clipboard" class="copyButton_10dd">Copy</button><div tabindex="0" class="prism-code language-cs codeBlock_3iAC"><div class="codeBlockLines_b7E3" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Fur.Core;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Fur.DatabaseAccessor;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">using Fur.DynamicApiController;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">using System.Collections.Generic;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">namespace Fur.Application</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    public class PersonService : IDynamicApiController</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// 可调配仓储（读写分离）</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;/summary&gt;</span></div><div class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">        private readonly IMSRepository&lt;MasterDbContextLocator, SlaveDbContextLocator&gt; _msRepository;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// 构造函数初始化</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;/summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;param name=&quot;msRepository&quot;&gt;&lt;/param&gt;</span></div><div class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">        public PersonService(IMSRepository&lt;MasterDbContextLocator, SlaveDbContextLocator&gt; msRepository)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            _msRepository = msRepository;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// 新增走主库</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;/summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;param name=&quot;person&quot;&gt;&lt;/param&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;returns&gt;&lt;/returns&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        public void Insert(Person person)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        {</span></div><div class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">            _msRepository.Master&lt;Person&gt;().Insert(person);</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// 查询走从库</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;/summary&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        /// &lt;returns&gt;&lt;/returns&gt;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        public List&lt;Person&gt; Get()</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        {</span></div><div class="token-line docusaurus-highlight-code-line" style="color:#bfc7d5"><span class="token plain">            return _msRepository.Slave1&lt;Person&gt;().AsEnumerable();</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span></div></div></div></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="9263-主从复制"></a>9.26.3 主从复制<a aria-hidden="true" tabindex="-1" class="hash-link" href="#9263-主从复制" title="Direct link to heading">#</a></h2><p>主从复制：是一种数据备份的方案。</p><p>简单来说，是使用两个或两个以上相同的数据库，将一个数据库当做主数据库，而另一个数据库当做从数据库。<strong>在主数据库中进行相应操作时，从数据库记录下所有主数据库的操作，使其二者一模一样。</strong></p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="9264-主从复制几种方式"></a>9.26.4 主从复制几种方式<a aria-hidden="true" tabindex="-1" class="hash-link" href="#9264-主从复制几种方式" title="Direct link to heading">#</a></h2><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92641-同步复制"></a>9.26.4.1 同步复制<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92641-同步复制" title="Direct link to heading">#</a></h3><p>所谓的同步复制，意思是 <code>Master</code> 的变化，必须等待 <code>Slave-1，Slave-2，...，Slave-n</code> 完成后才能返回。
这样，显然不可取，比如，在 <code>Web</code> 前端页面上，用户增加了条记录，需要等待很长时间。</p><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92642-异步复制"></a>9.26.4.2 异步复制<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92642-异步复制" title="Direct link to heading">#</a></h3><p>如同 AJAX 请求一样。<code>Master</code> 只需要完成自己的数据库操作即可。至于 <code>Slaves</code> 是否收到二进制日志，是否完成操作，不用关心。<strong>（推荐方式）</strong></p><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92643-半同步复制"></a>9.26.4.3 半同步复制<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92643-半同步复制" title="Direct link to heading">#</a></h3><p><code>Master</code> 只保证 <code>Slaves</code> 中的一个操作成功，就返回，其他 <code>Slave</code> 不管。</p><p>下面将使用 <code>SqlServer</code> 简单配置主从复制功能。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="9265-sqlserver-主库配置"></a>9.26.5 <code>SqlServer</code> 主库配置<a aria-hidden="true" tabindex="-1" class="hash-link" href="#9265-sqlserver-主库配置" title="Direct link to heading">#</a></h2><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92651-添加-本地发布"></a>9.26.5.1 添加 <code>本地发布</code><a aria-hidden="true" tabindex="-1" class="hash-link" href="#92651-添加-本地发布" title="Direct link to heading">#</a></h3><img src="/img/dbcopy1.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92652-选择-分发服务器"></a>9.26.5.2 选择 <code>分发服务器</code><a aria-hidden="true" tabindex="-1" class="hash-link" href="#92652-选择-分发服务器" title="Direct link to heading">#</a></h3><img src="/img/dbcopy2.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92653-启用-代理"></a>9.26.5.3 启用 <code>代理</code><a aria-hidden="true" tabindex="-1" class="hash-link" href="#92653-启用-代理" title="Direct link to heading">#</a></h3><img src="/img/dbcopy3.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92654-发布数据库"></a>9.26.5.4 发布数据库<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92654-发布数据库" title="Direct link to heading">#</a></h3><img src="/img/dbcopy4.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92655-快照发布"></a>9.26.5.5 快照发布<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92655-快照发布" title="Direct link to heading">#</a></h3><img src="/img/dbcopy5.png"><p>具体选择何种发布类型，视具体业务场景而定。</p><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92656-选择发布项目"></a>9.26.5.6 选择发布项目<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92656-选择发布项目" title="Direct link to heading">#</a></h3><img src="/img/dbcopy6.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92657-配置分发计划"></a>9.26.5.7 配置分发计划<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92657-配置分发计划" title="Direct link to heading">#</a></h3><img src="/img/dbcopy7.png"><img src="/img/dbcopy8.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92658-配置安全设置"></a>9.26.5.8 配置安全设置<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92658-配置安全设置" title="Direct link to heading">#</a></h3><img src="/img/dbcopy9.png"><img src="/img/dbcopy10.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92659-完成配置"></a>9.26.5.9 完成配置<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92659-完成配置" title="Direct link to heading">#</a></h3><img src="/img/dbcopy11.png"><img src="/img/dbcopy12.png"><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="9266-sqlserver-从库配置"></a>9.26.6 <code>SqlServer</code> 从库配置<a aria-hidden="true" tabindex="-1" class="hash-link" href="#9266-sqlserver-从库配置" title="Direct link to heading">#</a></h2><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92661-添加-本地订阅"></a>9.26.6.1 添加 <code>本地订阅</code><a aria-hidden="true" tabindex="-1" class="hash-link" href="#92661-添加-本地订阅" title="Direct link to heading">#</a></h3><img src="/img/dbrece1.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92662-选择-分发服务器"></a>9.26.6.2 选择 <code>分发服务器</code><a aria-hidden="true" tabindex="-1" class="hash-link" href="#92662-选择-分发服务器" title="Direct link to heading">#</a></h3><img src="/img/dbrece2.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92663-选择-分发代理位置"></a>9.26.6.3 选择 <code>分发代理位置</code><a aria-hidden="true" tabindex="-1" class="hash-link" href="#92663-选择-分发代理位置" title="Direct link to heading">#</a></h3><img src="/img/dbrece3.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92664-选择-订阅数据库"></a>9.26.6.4 选择 <code>订阅数据库</code><a aria-hidden="true" tabindex="-1" class="hash-link" href="#92664-选择-订阅数据库" title="Direct link to heading">#</a></h3><img src="/img/dbrece4.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92665-选择-分发安全设置"></a>9.26.6.5 选择 <code>分发安全设置</code><a aria-hidden="true" tabindex="-1" class="hash-link" href="#92665-选择-分发安全设置" title="Direct link to heading">#</a></h3><img src="/img/dbrece5.png"><img src="/img/dbrece6.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92666-选择-同步计划"></a>9.26.6.6 选择 <code>同步计划</code><a aria-hidden="true" tabindex="-1" class="hash-link" href="#92666-选择-同步计划" title="Direct link to heading">#</a></h3><img src="/img/dbrece7.png"><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="92667-完成订阅"></a>9.26.6.7 完成订阅<a aria-hidden="true" tabindex="-1" class="hash-link" href="#92667-完成订阅" title="Direct link to heading">#</a></h3><img src="/img/dbrece8.png"><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="9267-分发定义监视"></a>9.26.7 分发定义监视<a aria-hidden="true" tabindex="-1" class="hash-link" href="#9267-分发定义监视" title="Direct link to heading">#</a></h2><img src="/img/dbrece9.png"><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="9268-查看主从复制结果"></a>9.26.8 查看主从复制结果<a aria-hidden="true" tabindex="-1" class="hash-link" href="#9268-查看主从复制结果" title="Direct link to heading">#</a></h2><img src="/img/dbrece10.png"><img src="/img/dbrece11.png"><div class="admonition admonition-important alert alert--info"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>特别特性</h5></div><div class="admonition-content"><p>主从复制有一定迟延性，所以系统设计要有一定“容忍性&quot;。</p></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_2cZh" id="9269-反馈与建议"></a>9.26.9 反馈与建议<a aria-hidden="true" tabindex="-1" class="hash-link" href="#9269-反馈与建议" title="Direct link to heading">#</a></h2><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>与我们交流</h5></div><div class="admonition-content"><p>给 Fur 提 <a href="https://gitee.com/monksoul/Fur/issues/new?issue" target="_blank" rel="noopener noreferrer">Issue</a>。</p></div></div></div></article><div class="margin-vert--xl"><div class="row"><div class="col"><a href="https://gitee.com/monksoul/Fur/tree/main/handbook/docs/dbcontext-read-write.mdx" target="_blank" rel="noreferrer noopener"><svg fill="currentColor" height="1.2em" width="1.2em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 40 40" style="margin-right:0.3em;vertical-align:sub"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div></div></div><div class="margin-vert--lg"><nav class="pagination-nav" aria-label="Blog list page navigation"><div class="pagination-nav__item"><a class="pagination-nav__link" href="/docs/tran"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">« 9.25 事务和工作单元</div></a></div><div class="pagination-nav__item pagination-nav__item--next"><a class="pagination-nav__link" href="/docs/split-db"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">9.27 分表分库 »</div></a></div></nav></div></div></div><div class="col col--3"><div class="tableOfContents_3SO_"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#9261-读写分离" class="table-of-contents__link">9.26.1 读写分离</a><ul><li><a href="#92611-解决了什么问题" class="table-of-contents__link">9.26.1.1 解决了什么问题</a></li><li><a href="#92612-注意事项" class="table-of-contents__link">9.26.1.2 注意事项</a></li></ul></li><li><a href="#9262-如何实现" class="table-of-contents__link">9.26.2 如何实现</a><ul><li><a href="#92621-创建-主库-数据库上下文" class="table-of-contents__link">9.26.2.1 创建 <code>主库</code> 数据库上下文</a></li><li><a href="#92622-创建-从库-数据库上下文" class="table-of-contents__link">9.26.2.2 创建 <code>从库</code> 数据库上下文</a></li><li><a href="#92623-注册-主从库-数据库上下文" class="table-of-contents__link">9.26.2.3 注册 <code>主从库</code> 数据库上下文</a></li><li><a href="#92624-创建-person-实体" class="table-of-contents__link">9.26.2.4 创建 <code>Person</code> 实体</a></li><li><a href="#92625-将-person-转换成数据库表" class="table-of-contents__link">9.26.2.5 将 <code>Person</code> 转换成数据库表</a></li><li><a href="#92626-使用例子" class="table-of-contents__link">9.26.2.6 使用例子</a></li></ul></li><li><a href="#9263-主从复制" class="table-of-contents__link">9.26.3 主从复制</a></li><li><a href="#9264-主从复制几种方式" class="table-of-contents__link">9.26.4 主从复制几种方式</a><ul><li><a href="#92641-同步复制" class="table-of-contents__link">9.26.4.1 同步复制</a></li><li><a href="#92642-异步复制" class="table-of-contents__link">9.26.4.2 异步复制</a></li><li><a href="#92643-半同步复制" class="table-of-contents__link">9.26.4.3 半同步复制</a></li></ul></li><li><a href="#9265-sqlserver-主库配置" class="table-of-contents__link">9.26.5 <code>SqlServer</code> 主库配置</a><ul><li><a href="#92651-添加-本地发布" class="table-of-contents__link">9.26.5.1 添加 <code>本地发布</code></a></li><li><a href="#92652-选择-分发服务器" class="table-of-contents__link">9.26.5.2 选择 <code>分发服务器</code></a></li><li><a href="#92653-启用-代理" class="table-of-contents__link">9.26.5.3 启用 <code>代理</code></a></li><li><a href="#92654-发布数据库" class="table-of-contents__link">9.26.5.4 发布数据库</a></li><li><a href="#92655-快照发布" class="table-of-contents__link">9.26.5.5 快照发布</a></li><li><a href="#92656-选择发布项目" class="table-of-contents__link">9.26.5.6 选择发布项目</a></li><li><a href="#92657-配置分发计划" class="table-of-contents__link">9.26.5.7 配置分发计划</a></li><li><a href="#92658-配置安全设置" class="table-of-contents__link">9.26.5.8 配置安全设置</a></li><li><a href="#92659-完成配置" class="table-of-contents__link">9.26.5.9 完成配置</a></li></ul></li><li><a href="#9266-sqlserver-从库配置" class="table-of-contents__link">9.26.6 <code>SqlServer</code> 从库配置</a><ul><li><a href="#92661-添加-本地订阅" class="table-of-contents__link">9.26.6.1 添加 <code>本地订阅</code></a></li><li><a href="#92662-选择-分发服务器" class="table-of-contents__link">9.26.6.2 选择 <code>分发服务器</code></a></li><li><a href="#92663-选择-分发代理位置" class="table-of-contents__link">9.26.6.3 选择 <code>分发代理位置</code></a></li><li><a href="#92664-选择-订阅数据库" class="table-of-contents__link">9.26.6.4 选择 <code>订阅数据库</code></a></li><li><a href="#92665-选择-分发安全设置" class="table-of-contents__link">9.26.6.5 选择 <code>分发安全设置</code></a></li><li><a href="#92666-选择-同步计划" class="table-of-contents__link">9.26.6.6 选择 <code>同步计划</code></a></li><li><a href="#92667-完成订阅" class="table-of-contents__link">9.26.6.7 完成订阅</a></li></ul></li><li><a href="#9267-分发定义监视" class="table-of-contents__link">9.26.7 分发定义监视</a></li><li><a href="#9268-查看主从复制结果" class="table-of-contents__link">9.26.8 查看主从复制结果</a></li><li><a href="#9269-反馈与建议" class="table-of-contents__link">9.26.9 反馈与建议</a></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container"><div class="row footer__links"><div class="col footer__col"><h4 class="footer__title">文档</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/docs/get-start">入门</a></li><li class="footer__item"><a class="footer__link-item" href="/docs">指南</a></li></ul></div><div class="col footer__col"><h4 class="footer__title">社区</h4><ul class="footer__items"><li class="footer__item"><a href="https://gitee.com/monksoul/Fur/issues" target="_blank" rel="noopener noreferrer" class="footer__link-item">讨论</a></li><li class="footer__item"><a href="https://gitee.com/monksoul/Fur/board" target="_blank" rel="noopener noreferrer" class="footer__link-item">看板</a></li></ul></div><div class="col footer__col"><h4 class="footer__title">更多</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/blog">博客</a></li><li class="footer__item"><a href="https://gitee.com/monksoul/Fur" target="_blank" rel="noopener noreferrer" class="footer__link-item">仓库</a></li></ul></div></div><div class="text--center"><div>Copyright © 2020 Fur, Baiqian Co.,Ltd.</div></div></div></footer></div>
<script src="/styles.8352e18a.js"></script>
<script src="/runtime~main.98e14d7d.js"></script>
<script src="/main.04e1b7d6.js"></script>
<script src="/1.72c59440.js"></script>
<script src="/2.a2e0b0a9.js"></script>
<script src="/3.054f69af.js"></script>
<script src="/1be78505.da78ff7d.js"></script>
<script src="/85.0018927c.js"></script>
<script src="/f976f453.e1be0e0e.js"></script>
<script src="/17896441.9aece880.js"></script>
<script src="/4dbcf072.85d323b6.js"></script>
</body>
</html>